package com.example.demo.web;

import com.example.demo.bean.dto.StudentDTO;
import com.example.demo.common.CommonResult;
import com.example.demo.common.ResponseResult;
import com.example.demo.common.ResponseResultFactory;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.annotations.ApiIgnore;

import java.util.ArrayList;
import java.util.List;

/**
 * @author lyc
 * @date 2019/6/13.
 * https://www.jianshu.com/p/645c140d4ab5
 */

@RestController
@RequestMapping("/swagger-test")
@Api(value = "测试第一个controller")
public class SwaggerAction {

    /**
     * swagger 常用注解
       swagger 通过注解表明该接口会生成文档，包括接口名、请求方法、参数、返回信息的等等。


     @Api：用在类上，说明该类的作用。

     @ApiOperation：注解来给API增加方法说明。

     @ApiImplicitParams : 用在方法上包含一组参数说明。

     @ApiImplicitParam：用来注解来给方法入参增加说明。

     @ApiResponses：用于表示一组响应

     @ApiResponse：用在@ApiResponses中，一般用于表达一个错误的响应信息

      *  code：数字，例如400

      *  message：信息，例如"请求参数没填好"

      *  response：抛出异常的类

     @ApiModel：描述一个Model的信息（一般用在请求参数无法使用@ApiImplicitParam注解进行描述的时候）

      *  @ApiModelProperty：描述一个model的属性



    注意：@ApiImplicitParam的参数说明：

    paramType：指定参数放在哪个地方
    header：请求参数放置于Request Header，使用@RequestHeader获取

    query：请求参数放置于请求地址，使用@RequestParam获取

    path：（用于restful接口）-->请求参数的获取：@PathVariable

    body：（不常用）

    form（不常用）

    name：参数名
    dataType：参数类型
    required：参数是否必须传	true | false
    value：说明参数的意思
    defaultValue：参数的默认值
     */



    @ApiOperation(value = "controllerA的测试方法一",notes = "controllerA的测试方法一")
    @GetMapping("/test1")
    public StudentDTO test1(){
        return new StudentDTO();
    }

    @ApiOperation(value = "通用结果返回对象",notes = "通用结果返回对象")
    @GetMapping("/test12")
    public CommonResult<StudentDTO> test12(){
        return new CommonResult<StudentDTO>();
    }

    @ApiOperation(value = "通用结果返回对象集合",notes = "通用结果返回对象集合")
    @GetMapping("/test123")
    public CommonResult<List<StudentDTO>> test123(){
        return new CommonResult<List<StudentDTO>>();
    }


    @ApiOperation(value = "通用结果返回对象集合1111",notes = "通用结果返回对象集合sss")
    @GetMapping("/test1234")
    public CommonResult<String> test1234(){
        CommonResult commonResult = new CommonResult();
        commonResult.setCode(200);
        commonResult.setData(new StudentDTO());
        commonResult.setMsg("ok");
        return commonResult;
    }

    @ApiOperation(value = "添加学生",notes = "添加学生")
  /*  @ApiImplicitParams({
            @ApiImplicitParam(name = "name", value = "用户姓名", required = true, dataType = "String"),
            @ApiImplicitParam(name = "password", value = "用户密码", required = true, dataType = "String")
    })*/
    @PostMapping("/test2")
    public ResponseResult test2(StudentDTO studentDTO){
       return ResponseResultFactory.success("发送成功",studentDTO);
    }

    @ApiOperation(value = "controllerA的测试方法三",notes = "controllerA的测试方法三")
    @ApiImplicitParam(name = "name", value = "用户姓名", required = true, dataType = "String")
    @GetMapping("/test3")
    public void test3(String name){}

    // 该接口忽略
    @ApiIgnore
    @GetMapping("/test4")
    public void test4(String name){}

}